package cn.itsource.thisdemo;

/**
 * this:
 * 		1. 概念：就是指代当前对象，哪一个对象调用的方法有this，那么，this就是指哪一个对象
 * 
 * 		2. 作用：1和2最重要
 * 				1. 解决局部变量和成员变量的二义性
 * 				2. 本类中构造方法之间的相互调用，但是必须是构造方法内的第一句  
 * 					目的：
 * 						1. 可以在无参构造创建对象的时候有默认值
 * 						2. 可以简化代码，提高开发效率
 * 
 *			------------了解-------------------------------
 * 				3. 作为返回值返回  
 * 				4. 作为参数传递  
 * 
 *		封装步骤：设计类
 *				1. 私有化成员变量
 *				2. 为每一个成员变量提供一个公共的方法：
 *						void setXxx(...)赋值方法，用this解决二义性问题
 *						返回值 getXxx() 取值方法 ，如果成员变量是boolean类型，将getXxx()改为isXxx();
 *				3. 提供一个无参构造
 *					如果有需求，可以在提供有参构造，在有参构造中使用this，简化代码或者创建对象的时候给一个默认值
 *					使用的就是构造方法相互调用this(...);
 *
 *				4. 该类用public修饰
 *			只有满足以上4点，该类就是一个标准的JavaBean
 *
 *		账户类
 *
 *	需求：无参构造创建对象的时候，有一个默认值vip是false
 */
public class Account {
	private boolean vip;
	private String name;
	private String pwd;
	
	public Account() {
		/*
		 * this作用：
		 * 2. 本类中构造方法之间的相互调用，但是必须是构造方法内的第一句  
 * 					目的：
 * 						1. 可以在无参构造创建对象的时候有默认值
		 */
		this(false,"111111");
	}
	
	public Account(boolean vip, String name, String pwd) {
		/*this.vip = vip;
		this.name = name;
		可以用this调用构造方法优化代码
		*/
		
		/*
		 * this作用：
		 * 2. 本类中构造方法之间的相互调用，但是必须是构造方法内的第一句  
		 * 		这里只是调用下面的有参构造，并不会创建对象，只有new才是创建对象
  					目的：
  						2. 可以简化代码，提高开发效率
		 */
		this(vip,pwd);//2. 本类中构造方法之间的相互调用，但是必须是构造方法内的第一句  
		this.name = name;
	}

	/**
	 * 局部变量和成员变量的二义性（名字相同）
	 * @param name
	 */
	public Account(boolean vip,String pwd){
		//需要：给成员变量name赋值
//		name = name;//这里因为就近原则，name取得的局部变量，没有给成员变量赋值
		//指代当前对象的地址
		//1. 解决局部变量和成员变量的二义性
		this.vip = vip;//这里因为就近原则，name取得的局部变量，没有给成员变量赋值
		this.pwd = pwd;
	}
	
	public void setVip(boolean vip){
		this.vip = vip;
	}
	
	public boolean isVip(){
//		return name;//优先从局部范围找
		return this.vip;//会直接从成员变量找
	}
	
	public void printThis(){
		System.out.println("this : " + this);
	}
}
